package com.uco.oop;

public class Abstract {
    public static void main(String[] args) {
        // 抽象类是不能被实例化的
        // 主要是为了使多态更加优雅，父类不用写方法的具体内容（不是必须的）
        // 设计模式：模板方法设计模式（抽象类中的模版方法，子类实现具体的方法）
        Animal animal = new Dog();
        animal.introduce();
    }
}

abstract class Animal {
    // 使用 final 修饰模板方法，避免子类重写
    public final void introduce() {
        System.out.println("i am a animal");
        // 抽象方法，子类各自实现
        this.eat();
    }

    public abstract void eat();
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("dog eat");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("cat eat");
    }
}